package chapter05

/**
 *
 * @author cdhuangchao3
 * @date 2023/6/4 7:49 PM
 */
object Test05_Lambda {
  def main(args: Array[String]): Unit = {
    val fun = (name: String) => {
      println("fun:" + name)
    }
    fun("zs")

    def f(func: String => Unit): Unit = {
      func("abc")
    }

    f(fun)
    f((name: String) => println("fun:" + name))

    // 匿名函数简化原则：
    // （1）参数的类型可以省略，会根据形参进行自动推导
    f((name) => println(name))
    // （2）类型省略之后发现只有1个参数，则圆括号可以省略；其他情况，没有参数或参数超过1个的，永远不能省略圆括号
    f(name => println(name))
    // （3）匿名函数如果只有1行，则大括号可以省略
    f(name => println(name))
    // (4)如果参数只出现1次，则参数省略，且后面的参数可以用 _ 替代
    f(println(_))
    // （5）如果可以推断出，当前传入的println是一个函数体，而不是调用语句，可以直接省略下划线
    f(println)

    def f2p(func: (Int, Int) => Int) = func(1, 2)

    println(f2p((a, b) => a + b))
    println(f2p((a, b) => a - b))

    println(f2p(_ + _))

    println(f2p((a, b) => b - a))
    println(f2p(-_ + _))
  }
}
